package com.yuanshen.receive;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;

/**
 * 这是一个消息监听器类，用于监听RabbitMQ中的惰性队列。
 * 惰性队列是一种特殊类型的队列，在RabbitMQ中，它用于存储那些不经常访问的消息。
 * 这种队列通常用于减轻对内存的压力，因为它们会把消息存储在磁盘上，而不是常驻内存。
 */
@Component // 表示这个类是一个Spring组件，可以被Spring容器自动检测和管理。
@Slf4j // Lombok提供的注解，用于自动化生成日志对象。
public class LazyListener {

    /**
     * 这个方法用于监听惰性队列的消息。
     * 当RabbitMQ中的惰性队列有消息时，这个方法会被自动调用。
     *
     * @param message 接收到的消息内容。这是从队列中取出的消息。
     */
    @RabbitListener(
            bindings = @QueueBinding(
                    // 定义队列属性
                    value = @Queue(value = "lazy.queue", durable = "true",
                            arguments = @Argument(name = "x-queue-mode", value = "lazy")),
                    // 定义交换机属性，此处使用延迟交换机
                    exchange = @Exchange(value = "lazy.direct", delayed = "true"),
                    // 定义路由键，消息通过这个键被路由到指定的队列
                    key = "lazy"
            ))
    public void listenLazyQueue(String message) {
        // 在这里处理接收到的消息
        log.info("接收到惰性队列消息, 内容: {}", message);
    }

    /**
     * 普通的队列，用于和惰性队列来做区分。
     * @param message
     * @throws InterruptedException
     */
    @RabbitListener(
            bindings = @QueueBinding(
                    value = @Queue(value = "normal.queue",durable = "true"),
                    exchange =@Exchange(value = "normal.direct",delayed = "true"),
                    key = "normal"
            ))
    public void normalQueue(String message) throws InterruptedException {
        Thread.sleep(5000);
        log.info("测试正常队列,{}",message);
    }
}
